home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / pump_src / setup / reader.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-10-26  |  4.8 KB  |  218 lines

  1. {$A+,B-,D+,E-,F-,G+,I-,L+,N-,O-,R-,S-,V-,X+}
  2. UNIT Reader;
  3.  
  4.    (* Copyright by Jare/Iguana in 1993, but given to the public domain. *)
  5.    (* Want more comments? Write'em!                                     *)
  6.  
  7.    (*   Text file reader. The text file can't be longer than it is now, *)
  8.    (* because I am a lazy coder and don't want to make a real scroller. *)
  9.    (* The text file must fit in the video memory, last six pages. That  *)
  10.    (* means 6*25 = 150 lines.                                           *)
  11.  
  12.    (*   Text colors are created on-the-fly, depending on the structure  *)
  13.    (* of the file, i.e. this line begins with '-', so make it yellow.   *)
  14.  
  15.    (*   This coloring idea came from the boss at my job. :-)            *)
  16.  
  17. INTERFACE
  18.  
  19. PROCEDURE ReadText;
  20.  
  21.  
  22.  
  23.    (* ========================================= *)
  24.  
  25. IMPLEMENTATION
  26.  
  27. USES
  28.    DOS,
  29.    Gfx, Output, HexConversions;
  30.  
  31.  
  32. PROCEDURE WriteLine(y : INTEGER; s : STRING);
  33. VAR
  34.    i   : INTEGER;
  35.    col : BYTE;
  36. BEGIN
  37.    col := 0;
  38.    FOR i := 1 TO Length(s) DO BEGIN
  39.        IF (col = 0) AND (s[i] <> ' ') THEN
  40.           IF (i = 2) THEN
  41.              col := 8
  42.           ELSE IF (s[36] = ' ') AND (s[1] = '├') THEN
  43.              col := 14
  44.           ELSE IF (s[9] = '-') THEN
  45.              col := 15
  46.           ELSE IF (s[i] = '·') THEN
  47.              col := 15
  48.           ELSE IF s[3] = '+' THEN
  49.              col := 11
  50. (*
  51.           ELSE IF i = 17 THEN
  52.              col := 15
  53. *)
  54.           ELSE
  55.              col := 3;
  56.  
  57.        Scr[y, i, 0] := BYTE(s[i]);
  58.        Scr[y, i, 1] := col;
  59. (*
  60.        IF (col = 14) AND ((s[i] = '-') OR (s[i] = ':')) THEN
  61.           col := 3;
  62. *)
  63.    END;
  64.    IF Length(s) < 80 THEN
  65.       FOR i := Length(s)+1 TO 80 DO BEGIN
  66.          Scr[y, i, 0] := 32;
  67.          Scr[y, i, 1] := col
  68.       END;
  69. END;
  70.  
  71.  
  72. VAR
  73.    NLines : INTEGER;
  74.    nfo    : ARRAY [1..200] OF STRING[80];
  75.    Pos    : WORD;
  76. CONST
  77.    key    : BYTE = 0;
  78.  
  79. PROCEDURE KbHandler; INTERRUPT;
  80. BEGIN
  81.    ASM
  82.         IN      AL,60h
  83.         TEST    AL,80h
  84.         JZ      @@ok
  85.          XOR    AL,AL
  86.      @@ok:
  87.         MOV     [key],AL
  88.  
  89.         IN      AL,61h
  90.         MOV     AH,AL
  91.         OR      AL,80h
  92.         OUT     61h,AL
  93.         MOV     AL,AH
  94.         OUT     61h,AL
  95.         MOV     AL,20h         { Signal EOI. }
  96.         OUT     20h,AL
  97.    END
  98. END;
  99.  
  100.  
  101. PROCEDURE ReadText;
  102. VAR
  103.    i   : INTEGER;
  104.    vel : INTEGER;
  105.    k   : BYTE;
  106.    time: INTEGER;
  107.    oldh : POINTER;
  108. BEGIN
  109.    SetKeyRate(0, 0);
  110.    GetIntVec(9, oldh);
  111.    SetIntVec(9, @KbHandler);
  112.    ClearScreen(scr[26]);
  113.    FOR i := 1 TO NLines DO
  114.       WriteLine(i+25*2, nfo[i]);
  115.    vel := 0;
  116.    i   := 0;
  117.    REPEAT
  118.       SetScanStart(i);
  119.       INC (vel);
  120.       i := i + vel DIV 7;
  121.    UNTIL i >= 25*16*1;
  122.    REPEAT
  123.       SetScanStart(i);
  124.       i := i + vel DIV 7;
  125.    UNTIL i >= Pos-25*16;
  126.    REPEAT
  127.       SetScanStart(i);
  128.       DEC (vel);
  129.       i := i + vel DIV 7;
  130.    UNTIL (i >= Pos) OR (vel = 0);
  131.    SetScanStart(Pos);
  132.  
  133.    vel  := 0;
  134.    time := 0;
  135.    REPEAT
  136. {            WriteLine(Pos DIV 16 + 3, HexByte(key));}
  137.       IF (Time > 0) OR (key <> 0) THEN BEGIN
  138.          IF key <> 0 THEN BEGIN
  139.             k := Key;
  140.             Key  := 0;
  141.             time := 3;
  142.          END;
  143.          CASE k OF
  144.             72 : IF (vel > -8*6) THEN DEC(vel,1);
  145.             80 : IF (vel <  8*6) THEN INC(vel,1);
  146.             81 : INC(vel, 3);
  147.             73 : DEC(vel, 3);
  148.          END;
  149.          DEC(time);
  150.       END ELSE
  151.          IF (vel > 0) THEN
  152.             DEC(vel,5)
  153.          ELSE IF (vel < 0) THEN
  154.             INC(vel,5);
  155.  
  156.       INC(Pos, vel DIV 8);
  157.  
  158.       IF (Pos < 25*16*2) THEN
  159.          Pos := 25*16*2
  160.       ELSE IF (Pos > (24+NLines)*16) THEN
  161.          Pos := (24+NLines)*16;
  162.  
  163.       SetScanStart(Pos)
  164.    UNTIL (k = 28) OR (k = 1);
  165.  
  166.    vel := 0;
  167.    i   := Pos;
  168.    REPEAT
  169.       SetScanStart(i);
  170.       DEC (vel);
  171.       i := i + vel DIV 7;
  172.    UNTIL i <= Pos-25*16;
  173.    REPEAT
  174.       SetScanStart(i);
  175.       i := i + vel DIV 7;
  176.    UNTIL i <= 25*16*1;
  177.    REPEAT
  178.       SetScanStart(i);
  179.       INC (vel);
  180.       i := i + vel DIV 7;
  181.    UNTIL (i <= 0) OR (vel = 0);
  182.    SetScanStart(0);
  183.    SetIntVec(9, oldh);
  184.    SetKeyRate(1, 12);
  185. END;
  186.  
  187.  
  188.   (* Here comes the reading of the text file. Shouldn't be here, but... *)
  189.  
  190. VAR
  191.    f   : TEXT;
  192.    i   : INTEGER;
  193.  
  194. BEGIN
  195.    Assign(f, 'README.TXT');
  196.    nfo[1] := ' Browse the text with the cursor keys, PgUp & PgDn. Press ESC or RETURN to exit';
  197.    nfo[2] := ' ';
  198.    NLines := 2;
  199.    Pos := 25*16*2;
  200.    Reset(f);
  201.    IF IOResult <> 0 THEN BEGIN
  202.       EXIT
  203.    END;
  204.    FOR i := 1 TO 150 DO BEGIN
  205.       INC (NLines);
  206.       nfo[NLines] := '';
  207.       ReadLn(f, nfo[NLines])
  208.    END;
  209.    Close(f);
  210.  
  211.    IF IOResult <> 0 THEN BEGIN
  212.       WriteLn('README.TXT not found, aborting...');
  213.       WriteLn('Get the full version of Pump!');
  214.       HALT(1)
  215.    END;
  216.  
  217. END.
  218.